package xyz.ck.commons.interval;

import junit.framework.TestCase;

import org.junit.Test;

public class IntegerIntervalUnitTestCase {
	/**
	 * 1-10
	 */
	public static Interval<Integer> a = new IntervalUnit<Integer>(1, 10);
	/**
	 * 1
	 */
	public static Interval<Integer> b = new IntervalUnit<Integer>(1, 1);

	/**
	 * -10 - 0
	 */
	public static Interval<Integer> c = new IntervalUnit<Integer>(-10, 0);

	/**
	 * 1-10
	 */
	public static Interval<Integer> d = new IntervalUnit<Integer>(1, 10);

	/**
	 * 10
	 */
	public static Interval<Integer> e = new IntervalUnit<Integer>(10, 10);

	/**
	 * 9-10
	 */
	public static Interval<Integer> f = new IntervalUnit<Integer>(9, 10);

	/**
	 * 9-11
	 */
	public static Interval<Integer> g = new IntervalUnit<Integer>(9, 11);

	/**
	 * 11-22
	 */
	public static Interval<Integer> h = new IntervalUnit<Integer>(11, 22);

	/**
	 * 4-7
	 */
	public static Interval<Integer> i = new IntervalUnit<Integer>(4, 7);

	/**
	 * 14-17
	 */
	public static Interval<Integer> j = new IntervalUnit<Integer>(14, 17);

	@Test
	public void testIntersect() {

		TestCase.assertEquals(String.format("%s intersect %s", a, b),
				new IntervalUnit<Integer>(1, 1), a.intersect(b));

		TestCase.assertEquals(String.format("%s intersect %s", a, c), null,
				a.intersect(c));

		TestCase.assertEquals(String.format("%s intersect %s", a, f),
				a.intersect(f), f);

		TestCase.assertEquals(String.format("%s intersect %s", a, b), "1", a
				.intersect(b).toString());
	}

	@Test
	public void testIsContains() {

		TestCase.assertEquals(String.format("%s isContains %s", a, b), true,
				a.isContains(b));

		TestCase.assertEquals(String.format("%s isContains %s", a, c), false,
				a.isContains(c));

		TestCase.assertEquals(String.format("%s isContains %s", a, d), true,
				a.isContains(d));

		TestCase.assertEquals(String.format("%s isContains %s", a, f), true,
				a.isContains(f));

		TestCase.assertEquals(String.format("%s isContains %s", a, g), false,
				a.isContains(g));

		TestCase.assertEquals(String.format("%s isContains %s", a, h), false,
				a.isContains(h));
	}

	@Test
	public void testIsIn() {

		TestCase.assertEquals(String.format("%s isIn %s", a, 0), false,
				a.isIn(0));

		TestCase.assertEquals(String.format("%s isIn %s", a, 1), true,
				a.isIn(1));

		TestCase.assertEquals(String.format("%s isIn %s", a, 9), true,
				a.isIn(9));

		TestCase.assertEquals(String.format("%s isIn %s", a, 10), true,
				a.isIn(10));

		TestCase.assertEquals(String.format("%s isIn %s", a, 11), false,
				a.isIn(11));

	}

	@Test
	public void testIsIntersect() {
		TestCase.assertEquals(String.format("%s isIn %s", a, b), true,
				a.isIntersect(b));

		TestCase.assertEquals(String.format("%s isIn %s", a, c), false,
				a.isIntersect(c));

		TestCase.assertEquals(String.format("%s isIn %s", a, d), true,
				a.isIntersect(d));

		TestCase.assertEquals(String.format("%s isIn %s", a, e), true,
				a.isIntersect(e));

		TestCase.assertEquals(String.format("%s isIn %s", a, f), true,
				a.isIntersect(f));

		TestCase.assertEquals(String.format("%s isIn %s", a, g), true,
				a.isIntersect(g));

		TestCase.assertEquals(String.format("%s isIn %s", a, h), false,
				a.isIntersect(h));
	}

	@Test
	public void testMinus() {
		TestCase.assertEquals(String.format("%s intersect %s", a, b),
				new IntervalUnit<Integer>(2, 10), a.minus(b));

		TestCase.assertEquals(String.format("%s intersect %s", a, c),
				new IntervalUnit<Integer>(1, 10), a.minus(c));

		TestCase.assertEquals(String.format("%s intersect %s", a, d), null,
				a.minus(d));

		TestCase.assertEquals(String.format("%s intersect %s", a, e),
				new IntervalUnit<Integer>(1, 9), a.minus(e));

		TestCase.assertEquals(String.format("%s intersect %s", a, f),
				new IntervalUnit<Integer>(1, 8), a.minus(f));

		TestCase.assertEquals(String.format("%s intersect %s", a, g),
				new IntervalUnit<Integer>(1, 8), a.minus(g));

		TestCase.assertEquals(String.format("%s intersect %s", a, h), a,
				a.minus(h));
	}

	@Test
	public void testUnion() {
		TestCase.assertEquals(String.format("%s union %s", a, b),
				new IntervalUnit<Integer>(1, 10), a.union(b));

		TestCase.assertEquals(String.format("%s union %s", a, c),
				new IntervalUnit<Integer>(-10, 10), a.union(c));

		TestCase.assertEquals(String.format("%s union %s", a, d), a, a.union(d));

		TestCase.assertEquals(String.format("%s union %s", a, e),
				new IntervalUnit<Integer>(1, 10), a.union(e));

		TestCase.assertEquals(String.format("%s union %s", a, f),
				new IntervalUnit<Integer>(1, 10), a.union(f));

		TestCase.assertEquals(String.format("%s union %s", a, g),
				new IntervalUnit<Integer>(1, 11), a.union(g));

		TestCase.assertEquals(String.format("%s union %s", a, h),
				new IntervalUnit<Integer>(1, 22), a.union(h));
	}

	@Test
	public void testPush(){
		
	}
}
